import java.util.HashSet;
import java.util.Random;
import java.util.Set;

/**
 * 加减法口算练习系统 - V0.3
 * 功能：生成无重复算式的加减法习题，确保加减法都有一定比例
 * 特点：加法和不超过100，减法差不小于0，可以包含100以上的数和负数，无重复算式
 */
public class CalculationSystemV03 {
    public static void main(String[] args) {
        System.out.println("===== 加减法口算练习系统 - V0.3 =====");
        System.out.println("本次练习共50道题目，请认真完成！\n");
        
        generateExercises(50);
        
        System.out.println("\n===== 练习结束 =====");
    }
    
    /**
     * 生成指定数量的无重复加减法习题
     * @param count 习题数量
     */
    public static void generateExercises(int count) {
        Random random = new Random();
        int exercisesPerLine = 3; // 每行显示的题目数量
        Set<String> generatedExpressions = new HashSet<>(); // 用于存储已生成的算式，确保不重复
        
        // 确保至少有一定比例的加法和减法
        int additionCount = (int) Math.ceil(count * 0.4); // 至少40%的加法
        int subtractionCount = count - additionCount;
        
        int generatedAdditions = 0;
        int generatedSubtractions = 0;
        int totalGenerated = 0;
        
        while (totalGenerated < count) {
            boolean isAddition;
            
            // 如果加法或减法还没有达到要求的数量，优先生成对应的类型
            if (generatedAdditions < additionCount && generatedSubtractions < subtractionCount) {
                isAddition = random.nextBoolean(); // 随机选择加法或减法
            } else if (generatedAdditions < additionCount) {
                isAddition = true; // 必须生成加法
            } else {
                isAddition = false; // 必须生成减法
            }
            
            int num1, num2, result;
            String operator;
            
            if (isAddition) {
                // 加法：确保结果不超过100，可以包含负数
                num1 = random.nextInt(201) - 50; // -50到150
                int maxNum2 = 100 - num1;
                if (maxNum2 < -100) maxNum2 = -100;
                if (maxNum2 > 200) maxNum2 = 200;
                num2 = maxNum2 >= -100 ? random.nextInt(maxNum2 - (-100) + 1) + (-100) : -100;
                result = num1 + num2;
                operator = "+";
            } else {
                // 减法：确保结果非负，可以包含负数
                num1 = random.nextInt(201) - 50; // -50到150
                int minNum2 = num1 - 100;
                if (minNum2 < -100) minNum2 = -100;
                int maxNum2 = num1;
                num2 = minNum2 <= maxNum2 ? random.nextInt(maxNum2 - minNum2 + 1) + minNum2 : minNum2;
                result = num1 - num2;
                operator = "-";
            }
            
            // 创建算式的唯一标识符（不包含答案，因为答案是由算式决定的）
            String expression = num1 + " " + operator + " " + num2;
            
            // 检查是否已存在该算式
            if (!generatedExpressions.contains(expression)) {
                // 添加到已生成集合
                generatedExpressions.add(expression);
                
                // 更新计数器
                if (isAddition) {
                    generatedAdditions++;
                } else {
                    generatedSubtractions++;
                }
                totalGenerated++;
                
                // 输出题目，包含答案，使用格式化确保对齐
                System.out.printf("%2d. %3d %s %3d = %3d       ", totalGenerated, num1, operator, num2, result);
                
                // 每行显示指定数量的题目后换行
                if (totalGenerated % exercisesPerLine == 0) {
                    System.out.println();
                }
            }
        }
    }
}